package bean;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.Calendar;
import java.util.List;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpServletRequest;
import Model.Paciente;
import Utils.Uteis;
import DAO.CidDAO;
import DAO.PacienteDAO;

public class PacienteBean {
	private int id;
	private String nome;
	private String endereco;
	private String historico_clinico;
	private Date inicio_tratamento;
	private String cpf;
	private String telefone;
	private String celular;
	private String email;
	private String sexo;
	private String cep;
	private String rg;
	private Date data_nascimento;
	private int id_convenio;	
	private List<String> listaDiagnosticos;
	
	private UIInput idPacienteValidation;
	private UIInput dataValidation;
	
	public UIInput getIdPacienteValidation() {
		return idPacienteValidation;
	}
	public void setIdPacienteValidation(UIInput idPacienteValidation) {
		this.idPacienteValidation = idPacienteValidation;
	}	
	public Date getInicio_tratamento() {
		return inicio_tratamento;
	}
	public void setInicio_tratamento(Date inicio_tratamento) {
		this.inicio_tratamento = inicio_tratamento;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}
	public String getRg() {
		return rg;
	}
	public void setRg(String rg) {
		this.rg = rg;
	}
	public Date getData_nascimento() {
		return data_nascimento;
	}
	public void setData_nascimento(Date data_nascimento) {
		this.data_nascimento = data_nascimento;
	}
	public int getId_convenio() {
		return id_convenio;
	}
	public void setId_convenio(int id_convenio) {
		this.id_convenio = id_convenio;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getNome() {
		return nome;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setHistorico_clinico(String historico_clinico) {
		this.historico_clinico = historico_clinico;
	}
	public String getHistorico_clinico() {
		return historico_clinico;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getId() {
		return id;
	}	
		
	/**
	 * @return the listaDiagnosticos
	 */
	public List<String> getListaDiagnosticos() {
		return listaDiagnosticos;
	}
	/**
	 * @param listaDiagnosticos the listaDiagnosticos to set
	 */
	
	
	public void setListaDiagnosticos(List<String> listaDiagnosticos) {
		this.listaDiagnosticos = listaDiagnosticos;
	}	

	public UIInput getDataValidation() {
		return dataValidation;
	}
	public void setDataValidation(UIInput dataValidation) {
		this.dataValidation = dataValidation;
	}
	public String Salvar()
	{	
		try
		{
			java.sql.Date dataInicioTratamento = Uteis.javaDate2SqlDate(this.inicio_tratamento);
			java.sql.Date dataNascimento = Uteis.javaDate2SqlDate(this.data_nascimento);
			Paciente paciente = new Paciente();
			
			paciente.setNome(this.nome);
			paciente.setEndereco(this.endereco);
			paciente.setHistorico_clinico(this.historico_clinico);
			paciente.setInicio_tratamento(dataInicioTratamento);
			paciente.setCpf(this.cpf);			
			paciente.setTelefone(this.telefone);			
			paciente.setCelular(this.celular);
			paciente.setEmail(this.email);
			paciente.setSexo(this.sexo);
			paciente.setCep(this.cep);
			paciente.setRg(this.rg);
			paciente.setDataNascimento(dataNascimento);
			paciente.setIdConvenio(this.id_convenio);
			
			if(this.id > 0)
			{
				paciente.setIdPaciente(this.id);
				PacienteDAO.Update(paciente);				
			}
			else
			{
				this.id = PacienteDAO.Insert(paciente);				
			}
			
			// insere a lista de diagnosticos
			PacienteDAO.InsertDiagnosticos(this.listaDiagnosticos, this.id);
			
			paciente = null;
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações Salvas com sucesso"));			
		}
		catch(Exception sexc)
		{
			sexc.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao salvar as informações, contate o administrador do sistema"));
		}		
				
		return "paciente_list";		
	}
		
	public String Editar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
		int id =  Integer.parseInt(request.getParameter("idpaciente"));		
		Paciente paciente = null;
		
		try
		{
			paciente = PacienteDAO.LoadObject(id);			
			if (paciente != null)
			{
				Date data_inicio = paciente.getInicio_tratamento();
				Date data_nascimento = paciente.getDataNascimento();
				
				setNome(paciente.getNome());
				setCelular(paciente.getCelular());
				setCep(paciente.getCep());
				setCpf(paciente.getCpf());
				setData_nascimento(data_nascimento);			
				setEmail(paciente.getEmail());
				setEndereco(paciente.getEndereco());
				setHistorico_clinico(paciente.getHistorico_clinico());
				setId_convenio(paciente.getIdConvenio());
				setInicio_tratamento(data_inicio);
				setRg(paciente.getRg());
				setSexo(paciente.getSexo());
				setTelefone(paciente.getTelefone());
				setId(paciente.getIdPaciente());
				this.setListaDiagnosticos(PacienteDAO.GetCidArrayListPorPaciente(id));
			}		
			
			return "paciente_edit";
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return "paciente_list";
	}
	
	
	public String Inativar()
	{
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();		
		int id =  Integer.parseInt(request.getParameter("idpaciente"));
		
		try
		{
			PacienteDAO.InativarPaciente(id);
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("sucesso", new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", "Informações apagadas com sucesso"));			
		}
		catch(SQLException sexc)
		{
			sexc.printStackTrace();
			FacesContext facesContext = FacesContext.getCurrentInstance();
			facesContext.addMessage("erro", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro!", "Ocorreu um problema ao realizar a transação, contate o administrador do sistema"));
		}		
		return "paciente_list";
	}
	
	public void validaExistenciaPacientePorCpf(FacesContext context, UIComponent uicomponent, Object value)
	{
		String cpf = value.toString();
		FacesMessage message = new FacesMessage();
		int idPaciente = Integer.parseInt(this.idPacienteValidation.getSubmittedValue().toString());		

		if(Uteis.validaCPF(cpf))
		{
			if(PacienteDAO.ExistePacientePorCpf(cpf, idPaciente))
			{
				((UIInput)uicomponent).setValid(false);				
				message.setDetail("O CPF informado já encontra-se cadastrado!");        
				message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
				throw new ValidatorException(message);
			}			
		}
		else
		{
			((UIInput)uicomponent).setValid(false);				
			message.setDetail("O CPF informado não é válido!");        
			message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
			throw new ValidatorException(message);			
		}
	}
	
	public void validaExistenciaPacientePorRg(FacesContext context, UIComponent uicomponent, Object value)
	{
		String rg = value.toString();
		int idPaciente = Integer.parseInt(this.idPacienteValidation.getSubmittedValue().toString());
		
		if(PacienteDAO.ExistePacientePorRg(rg, idPaciente))
		{
			((UIInput)uicomponent).setValid(false);
			FacesMessage message = new FacesMessage();
			message.setDetail("O RG informado já encontra-se cadastrado!");        
			message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
			throw new ValidatorException(message);
		}			
	}
	
	public void validaDataFutura(FacesContext context, UIComponent uicomponent, Object value)
	{		
		Date dataSelecionada = (Date) value;	
		if(dataSelecionada.after(new Date()))
		{
			((UIInput)uicomponent).setValid(false);
			FacesMessage message = new FacesMessage();
			message.setDetail("A data não pode estar no futuro");        
			message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
			throw new ValidatorException(message);
		}
		
	}
	
	public void validaDataInicioTratamento(FacesContext context, UIComponent uicomponent, Object value)
	{		
		Date dataInicioTr = (Date) value;
		Date dataNasc = (Date) this.dataValidation.getLocalValue();
					
		if(dataNasc != null)
		{
			if(dataInicioTr.after(new Date()))
			{
				((UIInput)uicomponent).setValid(false);
				FacesMessage message = new FacesMessage();
				message.setDetail("A data não pode estar no futuro");        
				message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
				throw new ValidatorException(message);
			}
			else
			{
				if(dataInicioTr.before(dataNasc))
				{
					((UIInput)uicomponent).setValid(false);
					FacesMessage message = new FacesMessage();
					message.setDetail("O inicio do tratamento não pode menor que a data de nascimento");        
					message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
					throw new ValidatorException(message);					
				}
			}			
		}
		else
		{
			((UIInput)uicomponent).setValid(false);
			FacesMessage message = new FacesMessage();
			message.setDetail("Cheque a data de nascimento antes de continuar!");        	
			message.setSeverity(FacesMessage.SEVERITY_ERROR);	        
			throw new ValidatorException(message);			
		}
		
	}
	
}